package 线程池;

import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;

/**
 * @description:
 * @author: ywk
 * @date: 2020-12-09
 */
public class TestScheduledExecutor {
    /**
     * 总结：
     * scheduleAtFixedRate ，是以上一个任务开始的时间计时，period时间过去后，检测上一个任务是否执行完毕，
     * 如果上一个任务执行完毕，则当前任务立即执行，如果上一个任务没有执行完毕，则需要等上一个任务执行完毕后立即执行。
     * scheduleWithFixedDelay，是以上一个任务结束时开始计时，period时间过去后，立即执行。
     * 注意：
     * 通过ScheduledExecutorService执行的周期任务，如果任务执行过程中抛出了异常，
     * 那么过ScheduledExecutorService就会停止执行任务，且也不会再周期地执行该任务了。所以你如果想保住任务都一直被周期执行，那么catch一切可能的异常。
     * ————————————————
     * 版权声明：本文为CSDN博主「琳凯」的原创文章，遵循CC 4.0 BY-SA版权协议，转载请附上原文出处链接及本声明。
     * 原文链接：https://blog.csdn.net/u013819945/article/details/47723091
     * @param args
     */
    public static void main(String[] args) {
        TestScheduledExecutor test = new TestScheduledExecutor();
        test.testWithFixedDelay();
    }

    private ScheduledExecutorService executor;

    public TestScheduledExecutor() {
        executor = Executors.newScheduledThreadPool(4);
    }

    public void testAtFixedRate() {
        executor.scheduleAtFixedRate(new Runnable() {

            public void run() {
                System.out.println("====");
                try {
                    Thread.sleep(10000);
                    System.out.println("执行完毕");
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, 1000, 3000, TimeUnit.MILLISECONDS);
    }

    public void testWithFixedDelay() {
        executor.scheduleWithFixedDelay(new Runnable() {

            public void run() {
                System.out.println("====");
                try {
                    int i = 1 / 0;
                } catch (Exception e) {
                    e.printStackTrace();
                }
				/*
				try {
					Thread.sleep(10000);
					System.out.println("执行完毕");
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
				*/
            }
        }, 1000, 3000, TimeUnit.MILLISECONDS);
    }

}

